package com.guc.dao;

import com.guc.pojo.News;
import com.guc.pojo.User;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 封装jdbc操作
 * 1. 更新方法
 * 2.查询方法
 */
public class BaseDao {

    /**
     * 更新数据库方法
     * @param sql  sql
     * @return  执行结果
     */
    public int  updata(String sql){
        try {
            Connection getconn = JdbcUtill.getconn();
            Statement statement = JdbcUtill.getStatement(getconn);
            //更新
            int updat = JdbcUtill.updat(statement, sql);
            JdbcUtill.close(null,statement,getconn);
            return updat;
        }catch (Exception e){
            return 0;
        }

    }

    /**
     * 查询方法   +  泛型
     * @param sql
     * @param clasz  实体类对象，属性名必须和字段名一致
     * @return
     */
    public ArrayList<Object> query(String sql,Class clasz){
        //按照jdbc查询数据库
        ArrayList<Object> data = new ArrayList<>();
        try{
            Connection connection = JdbcUtill.getconn();
            Statement statement = JdbcUtill.getStatement(connection);
            //执行sql
            ResultSet resultSet = JdbcUtill.getResultSet(statement, sql);
            //解析+ 使用反射创建实体类对象
            //通过反射获取实体类属性名---字段名
//            获取实体类clasz的属性（私有）和方法
            Field[] declaredFields = clasz.getDeclaredFields();//字段名
            System.out.println(declaredFields);
            //方法
            Method[] declaredMethods = clasz.getDeclaredMethods();
            // 字段---set方法   集合
            Map<String,Method> objmap = new HashMap<>();
            Field.setAccessible(declaredFields,true);
            //解析方法
            for (Method method:declaredMethods){
                // set  get  构造方法， tostring。。。。。。
                for (Field field:declaredFields){
                    if(method.getName().toLowerCase().startsWith("set")&&method.getName().toLowerCase().contains(field.getName().toLowerCase())){
                        objmap.put(field.getName(),method);
                    }

                }
            }


            while (resultSet.next()){
                // 使用反射机制，创建clasz对象
                Object object = clasz.newInstance();
                System.out.println("obj = "+object);
                //取出objmap的值
                Set<String> strings = objmap.keySet();
                for(String name:strings){
                    Method method = objmap.get(name);// 获取的实体类 set方法
                    //通过name（属性名===字段名）
                    String string = resultSet.getString(name);//数据库的值
                    method.invoke(object,string);//通过反射机制，调用实体类中set方法，完成数据的初始化
                }
                //取出了一个对象  保存
                data.add(object);
            }

            //关闭资源
            JdbcUtill.close(resultSet,statement,connection);

        }catch (Exception e){
            e.printStackTrace();

        }
        return data;

        //按照反射机制，创建实体类对象
    }


    public static void main(String[] args) {
      BaseDao dao = new BaseDao();
        ArrayList<Object> query = dao.query("SELECT * FROM `user`", User.class);
        System.out.println(query);

        ArrayList<Object> query1 = dao.query("SELECT * FROM news_detail", News.class);
        System.out.println(query1);


        // 演示  商品表


    }

}
